package br.com.cs.controller;

import br.com.cs.dao.jdbc.UsuarioJDBC;
import br.com.cs.exception.DAOException;
import br.com.cs.exception.PojoException;
import br.com.cs.model.Usuario;
import br.com.cs.pojo.impl.UsuarioPojoImpl;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.ListDataModel;
import javax.faces.validator.ValidatorException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

@ManagedBean(name = "usuarioMB")
@RequestScoped

public class UsuarioMB extends AbstractController implements Serializable {
    
    private ListDataModel usuarios;
    private Usuario usuario;
    private Date data;
    private String filterName;
    private String filterValue;
    private List<Usuario> listaUsuarios = new ArrayList<Usuario>();

    public UsuarioMB() {
        usuario = new Usuario();
    }

    public ListDataModel getUsuarios() {
        try {
            if (usuarios != null) {
                return usuarios;
            } else {
                List usuarioList = UsuarioPojoImpl.getInstance().getAll();
                usuarios = new ListDataModel(usuarioList);
                return usuarios;
            }
        } catch (PojoException e) {
            addError(null, e.getSummaryMessage(), e.getDetailsMessage());
            return null;
        }
    }

    public void setUsuarios(ListDataModel usuarios) {
        this.usuarios = usuarios;
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    public Date getData() {
        return data;
    }

    public void setData(Date data) {
        this.data = data;
    }

    public String getFilterName() {
        return filterName;
    }

    public void setFilterName(String filterName) {
        this.filterName = filterName;
    }

    public String getFilterValue() {
        return filterValue;
    }

    public void setFilterValue(String filterValue) {
        this.filterValue = filterValue;
    }

    public List<Usuario> getListaUsuarios() {
        return listaUsuarios;
    }

    public void setListaUsuarios(List<Usuario> listaUsuarios) {
        this.listaUsuarios = listaUsuarios;
    }
    
    public String salvar() throws PojoException, DAOException {

        try {
            if (null != this.usuario.getId()) {
                UsuarioPojoImpl.getInstance().save(usuario);
                addInfo(null, "Informação! ERRO", "Usuario atualizada com sucesso");
                return "formUsuario";
            } else {
                UsuarioJDBC.getInstance().save(usuario);
                addInfo(null, "Informação! OK", "Usuario adicionada com sucesso");
                return "formUsuario";
            }

        } catch (PojoException e) {
            addError(null, e.getSummaryMessage(), e.getDetailsMessage());
            return "formUsuario";
        }

    }

    public String criarNovo() {
        this.usuario = new Usuario();
        return "formUsuario";
    }

    public String editar() {
        this.usuario = (Usuario) usuarios.getRowData();
        return "formUsuario";
    }

    public String remover() {
        usuario = (Usuario) usuarios.getRowData();
        try {
            UsuarioPojoImpl.getInstance().delete(usuario);
            addInfo(null, "Informação! ", "Usuario removido com sucesso");
            usuarios = null;
            return "listaUsuario";
        } catch (PojoException e) {
            addError(null, e.getSummaryMessage(), e.getDetailsMessage());
            return "listaUsuario";
        }
    }

    public void validaData(FacesContext context, UIComponent comp,
            Object valor) throws ValidatorException {
        Date cData = (Date) valor;
        if (cData.before(new Date())) {
            throw new ValidatorException(new FacesMessage("Data inválida. Digite uma data maior que o dia de hoje."));
        }
    }

    public String filtrar() {
        try {
            if (this.filterValue == null || "".equals(this.filterValue.trim())) {
                usuarios = null;
            } else {
                List usuariosList = UsuarioPojoImpl.getInstance().getByFilter(this.filterName.trim(), this.filterValue.trim());
                usuarios = new ListDataModel(usuariosList);
            }
        } catch (PojoException e) {
            addError(null, e.getSummaryMessage(), e.getDetailsMessage());
            return null;
        }
        return "listaUsuario";
    }
    
    
}
